using System;
using System.Data;

namespace Serpis
{
	public class AppDbConnection
	{
		private string usuario= "";
		private string contraseña= "";
		private const string connString = "server = localhost;" +
			"database = dbprueba;" +
			"user id = root;" +
			"password = sistemas";
		private IDbConnection dbConnection;
		private Type type; 
			
		//	Lo hacemos private para evitar que se instancie la clase desde fuera
		private AppDbConnection ()
		{	
		}
		//	Singleton:
		//	Crea una instancia de AppDbConnection e impide que se duplique la instancia
		private static AppDbConnection instance = new AppDbConnection();
//		****	DEVUELVE el objeto 'instance' que es del tipo 'AppDbConnection'
		public static AppDbConnection Instance
		{
			get
			{	
				return instance;
			}
		}
//		****	Crea la conexión y la devuelve - Inicialización PEREZOSA
		public IDbConnection DbConnection 
		{
			get 
			{
//				****	Si la conexión no está inicializada, se crea la conexión
				if(dbConnection == null) 
				{
					try
					{
						string connectionString= "server=localhost;database=dbprueba;uid="+usuario+";password="+contraseña+";";
						//	Utilizamos el constructor virtual 'Activator' para que nos cree un objeto del tipo del argumento que le pasamos
						//	que en este caso es type
						dbConnection= (IDbConnection) Activator.CreateInstance(type, connectionString);
						dbConnection.Open();
						Console.WriteLine("Conexion abierta");
					}
					catch
					{
						
					}
				}
				return dbConnection;
			}
		}
		

		
//		****	Esta función permite especificarle el tipo de conexion;
		public Type Type 
		{
			set 
			{
				type= value;
			}
		}
		
//		****	Establecemos los datos de autentificación de la conexion
		public IDbConnection CreateConnection(string uss, string pass)
		{
				this.usuario= uss;
				this.contraseña= pass;
				return DbConnection;
		}
//		****	Ejecuta consultas que no devuelven registros (Update y Delete)
		public int Consulta(string Query) 
		{
			IDbCommand command= dbConnection.CreateCommand();
			command.CommandText= Query;

			int resultado = 0;
			try 
			{
				resultado= command.ExecuteNonQuery();
			}
			catch
			{
				
			}
			return resultado;
		}
//		****	Cierra la conexion
		public void Close()
		{
			dbConnection.Close();
		}
	}
}

